<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 错误管理
 * @author 费尔 <admin@xuai.cn>
 */
class Error {

    private static $_info = [];

    /**
     * 注册异常处理
     * @return void
     */
    public static function init() {
//        if (APP_DEBUG) {
//            ini_set('display_errors', 'On');
//            error_reporting(E_ALL);
//        } else {
//            ini_set('display_errors', 'Off');
//            error_reporting(0);
//        }
        set_error_handler([__CLASS__, 'appError']);
        set_exception_handler([__CLASS__, 'appException']);
        register_shutdown_function([__CLASS__, 'appShutdown']);
    }

    /**
     * Exception Handler
     * @param  \Exception|\Throwable $e
     */
    public static function appException($e) {
        list($showtrace, $logtrace) = Debug::exception($e);
        self::$_info[] = $showtrace;
    }

    /**
     * Error Handler
     * @param  integer $errno   错误编号
     * @param  integer $errstr  详细错误信息
     * @param  string  $errfile 出错的文件
     * @param  integer $errline 出错行号
     * @param array    $errcontext
     * @throws ErrorException
     */
    public static function appError($errno, $errstr, $errfile = '', $errline = 0, $errcontext = []) {
        self::system($errstr);
    }

    /**
     * 系统错误
     * @param type $message
     * @param type $show
     * @param type $save
     * @param type $halt
     */
    public static function system($message, $show = true, $save = true, $halt = true) {
        list($showtrace, $logtrace) = Debug::backtrace();
        self::$_info[] = $message . "\r\nPHP:" . $logtrace;
    }

    /**
     * Shutdown Handler
     */
    public static function appShutdown() {
        // 写入日志
        !empty(self::$_info) && Log::save(self::$_info);
    }

}
